#pragma once
#include <iostream>

template<class T>
class auto_ptr
{
public:
    auto_ptr(T* ptr = nullptr)
    :_ptr(ptr)
    {
        std::cout << "auto_ptr" << std::endl;
    }

    // 析构时释放资源
    ~auto_ptr()
    {
        if(_ptr != nullptr)
        {
            delete _ptr;
            _ptr = nullptr;
        }
        std::cout << " ~auto_ptr" << std::endl;
    }

    T& operator*()
    {
        return *_ptr;
    }

    T* operator->()
    {
        return _ptr;
    }

    T*& get()
    {
        return _ptr;
    }

    // 赋值，资源只能被一个auto_ptr指向，p2 = p1
    auto_ptr<T>& operator=(auto_ptr<T>& p1)
    {
        if(this != &p1)
        {
            std::cout << "operator=" << std::endl;
            // 先释放ptr资源
            delete _ptr;
            // ptr指向p1资源
            _ptr = p1._ptr;
            // p1指向空
            p1._ptr = nullptr;
        }

        return *this;
    }

    // 拷贝构造p2(p1)
    auto_ptr(auto_ptr<T>& p1)
    {
        std::cout << "auto_ptr(auto_ptr<T>& p1)" << std::endl;
        // ptr指向p1资源
        _ptr = p1._ptr;
        // p1指向空
        p1._ptr = nullptr;
    }

private:
    T* _ptr; // 指针
};